package com.yupi.springbootinit.manager;

import com.yupi.springbootinit.utils.ChatAiUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.List;

/**
 * AI管理类
 * 用于统一管理AI相关功能调用
 */
@Service
@Slf4j
public class AiManager {

    @Value("${siliconflow.api-key}")
    private String apiKey;

    @Value("${siliconflow.model}")
    private String model;

    /**
     * 调用AI进行数据分析
     *
     * @param messages 消息列表
     * @return AI回复内容
     */
    public String doChat(List<ChatAiUtils.Message> messages) {
        return doChat(messages, 4096, 0.3);
    }

    /**
     * 调用AI进行数据分析（可自定义参数）
     *
     * @param messages 消息列表
     * @param maxTokens 最大token数
     * @param temperature 温度参数
     * @return AI回复内容
     */
    public String doChat(List<ChatAiUtils.Message> messages, Integer maxTokens, Double temperature) {
        int maxRetries = 3;
        int retryCount = 0;
        
        while (retryCount < maxRetries) {
            try {
                // 调用AI接口
                String response = ChatAiUtils.chatOpenAI(
                        apiKey,
                        model,
                        messages,
                        maxTokens,
                        temperature
                );
                return response;
            } catch (SocketTimeoutException e) {
                retryCount++;
                log.warn("AI调用超时，正在进行第{}次重试", retryCount, e);
                if (retryCount >= maxRetries) {
                    log.error("AI调用重试次数已用完，仍然失败", e);
                    return "AI调用失败: 请求超时，请稍后重试";
                }
                
                // 简单的退避策略，重试前等待一段时间
                try {
                    Thread.sleep(2000 * retryCount); // 等待2秒、4秒...
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                    return "AI调用失败: 请求被中断";
                }
            } catch (IOException e) {
                log.error("AI调用失败", e);
                return "AI调用失败: " + e.getMessage();
            }
        }
        
        return "AI调用失败: 未知错误";
    }
}